﻿using MylambdaLinqDemo.Linq;

namespace MylambdaLinqDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {


                ////一.Lambada
                new LambdaShow().Show(); //Lambada表达式前世今生

                //Linq：Linq是什么呢？ Linq和Lambda之间有啥关系？
                //先探讨一个话题---扩展方法

                //什么是扩展方法呢？
                //1. 静态类中的静态方法，同时方法的第一个参数使用this修饰，扩展方法；
                //2.好处：可以像实例方法一样，去调用

                Student student = new Student()
                {
                    Id = 123,
                    Name = "噼里啪啦先生",
                    Age = 28,
                    ClassId = 1
                };

                student.Study();

                //如果我想要成为一个架构师---如果出现这个需求---怎么办？
                //1.常规玩法：在Student内部增加了一个方法---修改了历史代码---重修发布部署，可能会影响其他的功能----开闭原则，   面向扩展开发，面向修改关闭； 尽可能不要修改历史代码。
                //student.StudyFramework();

                //2.什么是面向扩展开放呢？  有新需求，尽量是通过新增一个类来完成。 
                //MethodExtension.StudyFramework(student);
                student.StudyFramework();


                //扩展方法。
                //1. 如果实例中定义了一个方法，同时也扩展了一个和实力方法一样的，调用，默认是指向实例方法的。
                //什么场景下你们会考虑使用扩展方法？

                //增加功能，扩展方法----（扩展==增加）  方法===行为（业务逻辑处理），新增业务逻辑----有新需求的时候。
                //在asp.net core 中，到处都是扩展方法； asp.net core 对外提供的是一个最简单的功能，如果需要一些个性化的功能，就通过扩展方法来扩展。
                //
                //如果要使用第三方的dll， 类库。  类库是别人开发好的。 如果我希望基于这个类库新增一写功能。 但是我没有办法去修改别人提供的dll。  ------可以采用扩展方法；


                //来点小案例：
                {
                    //// 
                    //string decription = "大家好，欢迎大家来到.NET高级班的体验课~~";
                    //string s1 = decription.Stringlenth();
                    //string s2 = decription.Stringlenth(5);


                    //object obj = null;
                    //obj.ObjectExt();

                    ////能不能给Object扩展下；
                    //decription.ObjectExt();

                    //int i = 0;
                    //i.ObjectExt();

                    //DateTime date = DateTime.Now;
                    //date.ObjectExt();
                    ////说明扩展方法具有继承性，如果给父类扩展了功能，子类也会具备这个功能； object 是所有类型的父类；---污染性；

                    //obj.GenericExt();
                    //i.GenericExt();
                    //date.ObjectExt();

                    ////扩展object---和扩展泛型差不多的；
                }


                //三、Linq：
                LinqShow.Show();




            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}